package ControlEscolar.DAOS;

import ConectividadDatos.CargadorDatos;
import ConectividadDatos.EnlaceDB;
import ControlEscolar.DTOS.AlumnoDTO;
import ControlEscolar.DTOS.CalificacionesDTO;
import ControlEscolar.DTOS.CicloEscolarDTO;
import ControlEscolar.DTOS.CiclosConfiguracionDTO;
import ControlEscolar.DTOS.MateriaDTO;
import ControlEscolar.DTOS.ProfesorDTO;
import Herramientas.Herramientas;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author AlanGR
 */
public class ControlEscolarDAO {

    private EnlaceDB enlace;
    private CargadorDatos cargador;

    public ControlEscolarDAO() {
        enlace = new EnlaceDB();
        cargador = new CargadorDatos();
    }

    /**
     * CARGA TODOS LOS PROFESORES DE LA BASE DE DATOS
     *
     * @return
     */
    public Vector todoProfesor() {
        Vector vProfesores = new Vector();
        String sql = "SELECT * FROM profesores";
        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                ProfesorDTO p = new ProfesorDTO();
                p = cargador.profesoresDTO(rs);
                vProfesores.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return vProfesores;
    }

    /**
     * METODO PARA INSERTAR UN NUEVO PROFESOR
     */
    public void nuevoProfesor(ProfesorDTO p) {
        String sql = new String();
        sql += " INSERT INTO `profesores` SET";
        sql += "  profesores.`titulo` = " + p.getTitulo();
        sql += " , profesores.`nombres` = '" + p.getNombres() + "'";
        sql += " , profesores.`apellido_paterno` = '" + p.getApellidoPaterno() + "'";
        sql += " , profesores.`apellido_materno` = '" + p.getApellidoMaterno() + "'";
        sql += " , profesores.`direccion` = '" + p.getDireccion() + "'";
        sql += " , profesores.`telefono` = '" + p.getTelefono() + "'";
        sql += " , profesores.`celular` = '" + p.getCelular() + "'";
        sql += " , profesores.`email` = '" + p.getEmail() + "'";
        sql += " , profesores.`cp` = '" + p.getCp() + "'";
        sql += " , profesores.`fecha_nacimiento` = '" + p.getFechaNacimiento() + "';";
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * METODO QUE DEVUELVE UN PROFESOR SEGUN SU ID
     *
     * @param id
     * @return
     */
    public ProfesorDTO profesorXID(int id) {
        ProfesorDTO profesor = new ProfesorDTO();
        String sql = "SELECT * FROM profesores WHERE profesores.`id` = " + id;

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            if (rs.next()) {
                profesor = cargador.profesoresDTO(rs);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        enlace.closeDatabase();

        return profesor;
    }

    /**
     * actualiza el registro delprofesir
     *
     * @param p
     */
    public void actualizaProfesor(ProfesorDTO p) {
        String sql = new String();
        sql += "   UPDATE `profesores` SET";
        sql += "   profesores.`titulo` = " + p.getTitulo();
        sql += " , profesores.`nombres` = '" + p.getNombres() + "'";
        sql += " , profesores.`apellido_paterno` = '" + p.getApellidoPaterno() + "'";
        sql += " , profesores.`apellido_materno` = '" + p.getApellidoMaterno() + "'";
        sql += " , profesores.`direccion` = '" + p.getDireccion() + "'";
        sql += " , profesores.`telefono` = '" + p.getTelefono() + "'";
        sql += " , profesores.`celular` = '" + p.getCelular() + "'";
        sql += " , profesores.`email` = '" + p.getEmail() + "'";
        sql += " , profesores.`cp` = '" + p.getCp() + "'";
        sql += " , profesores.`fecha_nacimiento` = '" + p.getFechaNacimiento() + "'";
        sql += "   where id =" + p.getId();
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * INSERTA UN NUEVO CICLO
     *
     * @param c
     */
    public void insertarNuevoCiclo(CicloEscolarDTO c) {
        String sql = new String();
        sql += "INSERT INTO ciclos SET ";
        sql += "ciclos.`numero` = " + c.getNumero();
        sql += ",ciclos.`nombre` = '" + c.getNombre() + "'";
        sql += ",ciclos.`descripcion` = '" + c.getDescripcion() + "';";
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * devuelve un ciclo escolar por
     *
     * @param numeroCiclo
     * @return
     */
    public CicloEscolarDTO cicloEscolarDTO(int numeroCiclo) {

        String sql = new String();
        CicloEscolarDTO ciclo = new CicloEscolarDTO();

        sql += "SELECT * FROM ciclos WHERE ciclos.`numero` = " + numeroCiclo;

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            if (rs.next()) {
                ciclo = cargador.cicloEscolarDTO(rs);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return ciclo;
    }

    /**
     * INSETA MATERIA DEL CICLO ESCOLAR
     */
    public void insertarMateria(MateriaDTO m) {
        String sql = new String();
        sql += "INSERT INTO `materias_ciclo` SET ";
        sql += "`materias_ciclo`.`ciclo_id` = " + m.getCicloID();
        sql += ",`materias_ciclo`.`nombre` = '" + m.getNombreMateria() + "';";

        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();

    }

    /**
     * SELECCIONA LAS MATERIAS DE UN CICLO ESCOLAR
     *
     * @param idCiclo
     * @return
     */
    public Vector materiasTodasXCiclo(int idCiclo) {
        Vector vMaterias = new Vector();
        String sql = "SELECT * FROM `materias_ciclo` WHERE `materias_ciclo`.`ciclo_id` = " + idCiclo;
        enlace.openDatabase();
        ResultSet rst = enlace.executeQuery(sql);

        try {
            while (rst.next()) {
                MateriaDTO materiaCiclo = new MateriaDTO();
                materiaCiclo = cargador.materiaDTO(rst);
                vMaterias.add(materiaCiclo);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rst.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return vMaterias;
    }

    /**
     * metodo para cabiar de estado la disponibilidad del ciclo
     *
     * @param idCiclo
     */
    public void cambioEstadoCicloNoDisponible(int idCiclo) {
        String sql = " UPDATE ciclos_configuracion SET "
                + "`ciclos_configuracion`.`estado` = 0 WHERE `ciclos_configuracion`.`id` = " + idCiclo;
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * metodo para vector de ciclos disponibles
     *
     * @return
     */
    public Vector ciclosDisponibles() {
        Vector vCiclos = new Vector();
        String sql = "SELECT * FROM ciclos_configuracion WHERE ciclos_configuracion.estado > 0";

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                CiclosConfiguracionDTO ciclo = new CiclosConfiguracionDTO();
                ciclo = cargador.ciclosConfiguracionDTO(rs);
                vCiclos.add(ciclo);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return vCiclos;
    }

    /**
     * metodo que devuelve un vector todos los ciclos escolares
     *
     * @return
     */
    public Vector ciclosRegistrados() {
        Vector vCiclos = new Vector();

        String sql = "SELECT * FROM ciclos WHERE ciclos.estado > 0";

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                CicloEscolarDTO ciclo = new CicloEscolarDTO();
                ciclo = cargador.cicloEscolarDTO(rs);
                vCiclos.add(ciclo);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return vCiclos;
    }

    /**
     * METODO PARA BORRAR UN CICLO Y LAS MATERIAS REGISTRADAS DEL MISMO
     *
     * @param idCiclo
     */
    public void borrarCiclo(int idCiclo) {
        String sqlBorrrarCiclo = "DELETE FROM ciclos WHERE ciclos.id= " + idCiclo;
        String sqlBorrrarMateriasCiclo = "DELETE FROM materias_ciclo WHERE materias_ciclo.ciclo_id =  " + idCiclo;

        String sqlActivaCicloDisponible = "";
        sqlActivaCicloDisponible += " UPDATE ciclos_configuracion SET";
        sqlActivaCicloDisponible += "    ciclos_configuracion.estado = 1 ";
        sqlActivaCicloDisponible += " WHERE";
        sqlActivaCicloDisponible += "    ciclos_configuracion.numero_ciclo = " + idCiclo;

        enlace.openDatabase();
        enlace.execute(sqlBorrrarCiclo);
        enlace.execute(sqlBorrrarMateriasCiclo);
        enlace.execute(sqlActivaCicloDisponible);
        enlace.closeDatabase();
    }

    /**
     * BORRAR
     *
     * @param idMateriaCiclo
     */
    public void borrarMateriaCiclo(int idMateriaCiclo) {
        String sql = " DELETE FROM materias_ciclo WHERE materias_ciclo.id = " + idMateriaCiclo;
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * metodo vector alumnos
     *
     * @return
     */
    public Vector Alumnos() {
        Vector alumnos = new Vector();

        String sql = "SELECT * FROM alumno WHERE alumno.estado > 0;";

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                AlumnoDTO alumno = new AlumnoDTO();
                alumno = cargador.alumnoDTO(rs);
                alumnos.add(alumno);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return alumnos;

    }

    /**
     * metodo para insertar un buevo alumno
     *
     * @param a
     */
    public void insertarNuevoAlumno(AlumnoDTO a) {

        String sql = new String();

        sql += "  INSERT into alumno SET";
        sql += "  alumno.nombre = '" + a.getNombre() + "'";
        sql += ", alumno.appat = '" + a.getAppat() + "'";
        sql += ", alumno.apmat = '" + a.getApmat() + "'";
        sql += ", alumno.fenac = '" + a.getFenac() + "'";
        sql += ", alumno.nombre_tutor = '" + a.getNombreTutor() + "'";
        sql += ", alumno.grado = " + a.getGrado();
        sql += ", alumno.grupo = '" + a.getGrupo() + "'";
        sql += ", alumno.direccion = '" + a.getDireccion() + "'";
        sql += ", alumno.telefono = '" + a.getTelefono() + "'";
        sql += ", alumno.matricula = '" + a.getMatricula() + "'";
        sql += ", alumno.info = '" + a.getInfo() + "';";
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * metodo para insertar un buevo alumno
     *
     * @param a
     */
    public void editarAlumno(AlumnoDTO a) {

        String sql = new String();

        sql += "  UPDATE alumno SET";
        sql += "  alumno.nombre = '" + a.getNombre() + "'";
        sql += ", alumno.appat = '" + a.getAppat() + "'";
        sql += ", alumno.apmat = '" + a.getApmat() + "'";
        sql += ", alumno.fenac = '" + a.getFenac() + "'";
        sql += ", alumno.nombre_tutor = '" + a.getNombreTutor() + "'";
        sql += ", alumno.grado = " + a.getGrado();
        sql += ", alumno.grupo = '" + a.getGrupo() + "'";
        sql += ", alumno.direccion = '" + a.getDireccion() + "'";
        sql += ", alumno.telefono = '" + a.getTelefono() + "'";
        //sql += ", alumno.matricula = '" + a.getMatricula() + "'";
        sql += ", alumno.info = '" + a.getInfo() + "'";
        sql += "   where alumno.id =" + a.getId();
        enlace.openDatabase();
        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * metodo que genera una cadena aleatoria alfanumerica de cinco caracteres y
     * comrueba si ya fue asignada en caso de ser asignada se reinicia el hilo
     * en caso de no ser asignada se devuelve la cadena
     *
     * @return
     */
    public String matriculaSistemaAlumno() {
        Herramientas tools = new Herramientas();
        String aleatoria = "" + tools.enteroAleatorio(8); // entero de 8 digitros como matricula especifica que se le proporciona al alumno
        boolean matriculaAsignada = new Boolean(null);
        enlace.openDatabase();
        String sql = " select * from alumno where alumno.matricula = '" + aleatoria + "'";
        ResultSet rs = enlace.executeQuery(sql);
        try {
            if (rs.next()) {
                matriculaAsignada = true; // matricula sistema asignada
            } else {
                matriculaAsignada = false; // matricula disponible
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (matriculaAsignada == true) {
            matriculaAsignada = false;
            aleatoria = null;
            this.matriculaSistemaAlumno();
        } else {
            return aleatoria;
        }
        enlace.closeDatabase();
        return aleatoria;
    }

    /**
     * METODO PARA DEVOLVER UN ALUMNO POR ID
     *
     * @param id
     * @return
     */
    public AlumnoDTO alumnoXID(int id) {
        AlumnoDTO al = new AlumnoDTO();

        String sql = "SELECT * FROM alumno WHERE alumno.id = " + id;

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            if (rs.next()) {
                al = cargador.alumnoDTO(rs);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        enlace.closeDatabase();
        return al;

    }

    /**
     * metodo vector alumnos
     *
     * @return
     */
    public Vector alumnosXGrupo(int grado, String grupo) {
        Vector alumnos = new Vector();

        String sql = "SELECT * FROM  alumno WHERE alumno.grado = " + grado + " AND alumno.grupo = '" + grupo + "'";

        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                AlumnoDTO alumno = new AlumnoDTO();
                alumno = cargador.alumnoDTO(rs);
                alumnos.add(alumno);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return alumnos;

    }

    /**
     * metodo para registrar las calificaciones de un alumno
     *
     * @param c
     */
    public void insertaCalificacion(CalificacionesDTO c) {
        enlace.openDatabase();
        String sql = new String();

        sql += " INSERT INTO calificaciones SET";
        sql += " calificaciones.alumno_id = " + c.getAlumnoId();
        sql += " ,calificaciones.materia_id = " + c.getMateriaId();
        sql += " ,calificaciones.ciclo = " + c.getCiclo();
        sql += " ,calificaciones.parcial =" + c.getParcial();
        sql += " ,calificaciones.calificacion = " + c.getCalificacion();

        enlace.execute(sql);
        enlace.closeDatabase();
    }

    /**
     * REVISA ENL LA TABLA DE CALIFICACIONES LOS PARCIALES REGISTRADOS DEL
     * ALUMNO
     *
     * @param idAlumno
     * @return
     */
    public Vector parcialEsRegistradosAlumno(int idAlumno, int grado) {

        Vector parcialesRegistrados = new Vector();

        String sql = "SELECT DISTINCT calificaciones.parcial AS parcialesRegistrados FROM calificaciones WHERE calificaciones.alumno_id =" 
                + idAlumno + " AND calificaciones.ciclo ="+grado;

        //System.out.println("modifiar el query contemplando tambien el grado actual del alumno QUERY ::::: " + sql);
        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                parcialesRegistrados.add(rs.getInt("parcialesRegistrados"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return parcialesRegistrados;
    }

    /**
     *
     * @param parciales
     * @return
     */
    public Vector calificacionesParcial(int pacial, AlumnoDTO alumno) {
        Vector vParciales = new Vector();
        String sql = "SELECT calificaciones.*,materias_ciclo.nombre as tituloMateria "
                + "FROM calificaciones,materias_ciclo WHERE calificaciones.alumno_id = "+alumno.getId()+" "
                + "AND calificaciones.parcial ="+pacial+" AND calificaciones.materia_id = materias_ciclo.id AND calificaciones.ciclo = " + alumno.getGrado();

        
        System.out.println(" IMPRIMIEDO EL QUERY ");
        System.out.println(sql);
        enlace.openDatabase();
        ResultSet rs = enlace.executeQuery(sql);

        try {
            while (rs.next()) {
                CalificacionesDTO cal = new CalificacionesDTO();
                cal = cargador.calificacionesDTO(rs);
                cal.setMateriaTitulo(rs.getString("tituloMateria"));
                vParciales.add(cal);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        try {
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(ControlEscolarDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        enlace.closeDatabase();
        return vParciales;
    }

}
